<?php
//上传文件类
class UploadFile {
	private $postFileName;
	private $maxSize;
	private $error;
	private $type;
	private $typeArr = array('image/jpeg','image/pjpeg','image/png','image/x-png','image/gif'); //合法的上传文件类型集合
	private $upDir;                //上传文件目录
	private $todayDir;           //获取当天目录作为文件子目录
	private $oldName;            //上传文件原名称
	private $linkPath;           //上传文件的新目录
	private $newName;

	/*
	 * $postFileName 表单file的name值
	 * $maxSize 表单限制上传文件的大小
	 */
	public function __construct($postFileName,$maxSize) {
		//获取上传文件错误代码
		$this->error = $_FILES[$postFileName]['error'];
		//获得上传文件的类型
		$this->type = $_FILES[$postFileName]['type'];
		//转换为kb
		$this->maxSize = $maxSize / 1024;
		//默认目录为../uploads/
		$this->upDir = UP_DIR;
		//默认子目录为当天的日期目录
		$this->todayDir = $this->upDir.date('Ymd').'/';
		//文件原名字
		$this->oldName = $_FILES[$postFileName]['name'];
		//获取上传文件临时保存文件夹
		$this->tmpName = $_FILES[$postFileName]['tmp_name'];
		$this->checkError();
		$this->checkType();
		$this->checkUpDir();
		$this->checkTodayDir();
		$this->setNewName();
		$this->moveUploadFile();
	}

	//验证文件类型是否合法
	private function checkType() {
		if(!in_array($this->type,$this->typeArr)) {
			exit('警告：上传文件不合法!');
		}
	}

	//验证上传目录是否存在，不存在或不可写则创建该目录
	private function checkUpDir() {
		if(!is_dir($this->upDir) || !is_writeable($this->upDir)) {
			if(!mkdir($this->upDir)) {
				exit('警告：目录文件创建失败!');
			}
		}
	}

	//检验上传文件子目录是否存在，不存在或不可写则创建该目录
	private function checkTodayDir() {
		if(!is_dir($this->todayDir) || !is_writeable($this->todayDir)) {
			if(!mkdir($this->todayDir)) {
				exit('警告：创建子目录失败!');
			}
		}
	}

	//设置并获取新文件的完全路径
	private function setNewName() {
		$nameArr = explode('.',$this->oldName);
		//获取文件后缀名
		$fileExp = $nameArr[count($nameArr) - 1];
		//新的文件名字，由当天日期和一个随机数加上本来的后缀名组成
		$this->newName = date('YmdHis').mt_rand(100,1000).'.'.$fileExp;
		//返回完整的文件目录，主要用于后面的移动文件
		return $this->todayDir.$this->newName;
	}

	//获取上传文件的根目录绝对路径，主要用于写入数据库(对外接口)
	public function getLinkPath() {
		$dbSavedFileName = UP_DIR.date('Ymd').'/'.$this->newName;
		return $this->linkPath = $dbSavedFileName;
	}

	//判断临时文件是否存在，并把文件从临时文件夹移动到我们想要移动的文件夹
	private function moveUploadFile() {
		if(is_uploaded_file($this->tmpName)) {
			move_uploaded_file($this->tmpName,$this->setNewName());
		} else {
			exit('警告：临时文件夹不存在!');
		}
	}

	//验证文件错误代码
	private function checkError() {
		if(!empty($this->error)) {
			switch($this->error) {
				case 1 :
					exit('警告：上传文件超过约定最大值!');
					break;
				case 2 :
					exit('警告：上传文件超过html表单最大值'.$this->maxSize.'KB');
					break;
				case 3 :
					exit('警告：只有部分文件被上传!');
					break;
				case 4 :
					exit('警告：没有任何文件被上传!');
					break;
				default:
					exit('警告：未知错误!');
					break;
			}
		}
	}
}

?>